import os
import sys
import json
import argparse

# 添加项目根目录到Python路径
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_root)

from video_processing_modules.video_processor import VideoProcessor
from entity.video_types import VideoTextExtractionResult, BatchProcessingResult

def main() -> None:
    """
    测试视频处理功能
    
    最便捷使用方法:
    1. 处理单个视频文件:
       python video_processor_main.py --video your_video.mp4 --language en --output result.json
    2. 批量处理视频目录:
       python video_processor_main.py --dir your_video_directory --recursive --language en --output batch_result.json
    """
    parser = argparse.ArgumentParser(description='从视频中提取文字')
    parser.add_argument('--video', type=str, help='视频文件路径')
    parser.add_argument('--dir', type=str, help='视频目录路径')
    parser.add_argument('--recursive', action='store_true', help='是否递归处理子目录')
    # parser.add_argument('--frames', action='store_true', help='是否提取视频帧')
    parser.add_argument('--language', type=str, default='zh-CN', help='语言代码')
    parser.add_argument('--output', type=str, help='输出结果的JSON文件路径')
    parser.add_argument('--save-audio', type=str, help='保存提取的音频文件路径')
    
    args = parser.parse_args()
    
    # 创建视频处理器实例
    processor = VideoProcessor(language=args.language)
    
    # 处理单个视频文件
    if args.video:
        if os.path.exists(args.video):
            print(f"\n处理视频文件: {args.video}")
            
            # 如果需要保存音频文件
            if args.save_audio:
                # 先提取音频
                audio_path, error = processor._extract_audio_from_video(args.video)
                if error:
                    print(f"\n从视频中提取音频失败: {error}")
                    return
                
                # 复制音频文件到指定位置
                import shutil
                try:
                    shutil.copy2(audio_path, args.save_audio)
                    print(f"\n已将提取的音频保存到: {args.save_audio}")
                except Exception as e:
                    print(f"\n保存音频文件失败: {str(e)}")
                
                # 使用保存的音频文件进行文字识别
                result: VideoTextExtractionResult = processor.extract_text_from_video(
                    args.video,
                    save_audio_path=args.save_audio
                )
            else:
                # 正常处理
                result: VideoTextExtractionResult = processor.extract_text_from_video(
                    args.video
                )
            
            # 打印结果
            if result["success"]:
                print(f"\n成功从视频中提取文字:")
                print(f"文本内容: {result['text']}")
                print(f"分段数量: {len(result['segments'])}")
                print(f"提取的帧数: {len(result['frames'])}")
            else:
                print(f"\n从视频中提取文字失败: {result['error']}")
            
            # 保存结果到文件
            if args.output:
                with open(args.output, 'w', encoding='utf-8') as f:
                    json.dump(result, f, ensure_ascii=False, indent=2)
                print(f"\n结果已保存到: {args.output}")
        else:
            print(f"\n错误: 视频文件不存在: {args.video}")
    
    # 批量处理视频目录
    elif args.dir:
        if os.path.exists(args.dir) and os.path.isdir(args.dir):
            print(f"\n批量处理视频目录: {args.dir}")
            print(f"递归处理子目录: {'是' if args.recursive else '否'}")
            
            # 批量处理
            batch_result: BatchProcessingResult = processor.batch_process_videos(
                args.dir,
                recursive=args.recursive
            )
            
            # 打印结果
            if batch_result["success"]:
                print(f"\n批量处理完成:")
                print(f"总文件数: {batch_result['total_files']}")
                print(f"成功处理数: {batch_result['successful_extractions']}")
            else:
                print(f"\n批量处理失败: {batch_result['error']}")
            
            # 保存结果到文件
            if args.output:
                with open(args.output, 'w', encoding='utf-8') as f:
                    json.dump(batch_result, f, ensure_ascii=False, indent=2)
                print(f"\n结果已保存到: {args.output}")
        else:
            print(f"\n错误: 目录不存在: {args.dir}")
    
    else:
        print("\n请指定视频文件(--video)或视频目录(--dir)")
        parser.print_help()

if __name__ == "__main__":
    main()
